home *** CD-ROM | disk | FTP | other *** search
- //-----------------------------------------------------------------------------
- // File: DIUtil.cpp
- //
- // Desc: Input routines
- //
- // Copyright (C) 1995-2001 Microsoft Corporation. All Rights Reserved.
- //-----------------------------------------------------------------------------
- #include "duel.h"
- #include "diutil.h"
- #include "gameproc.h"
-
-
- //-----------------------------------------------------------------------------
- // Globals
- //-----------------------------------------------------------------------------
- static LPDIRECTINPUT g_pDI; // DirectInput interface
- static LPDIRECTINPUTDEVICE g_pdidKeyboard; // Keyboard device interface
- static BOOL g_bKeyboardAcquired; // Whether eyboard is acquired
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: DIUtil_InitInput()
- // Desc: Initialize DirectInput objects & devices
- //-----------------------------------------------------------------------------
- HRESULT DIUtil_InitInput( HWND hWnd )
- {
- // Create DI object
- HINSTANCE hInst;
- #ifdef _WIN64
- hInst = (HINSTANCE)GetWindowLongPtr( hWnd, GWLP_HINSTANCE );
- #else
- hInst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE );
- #endif
- if( FAILED( DirectInputCreate( hInst,
- DIRECTINPUT_VERSION, &g_pDI, NULL ) ) )
- {
- ShowError(IDS_DINPUT_ERROR_DIC);
- return E_FAIL;
- }
-
- // Create keyboard device
- if( FAILED( g_pDI->CreateDevice( GUID_SysKeyboard, &g_pdidKeyboard, NULL ) ) )
- {
- ShowError(IDS_DINPUT_ERROR_CD);
- return E_FAIL;
- }
-
- // Tell DirectInput that we want to receive data in keyboard format
- if( FAILED( g_pdidKeyboard->SetDataFormat( &c_dfDIKeyboard) ) )
- {
- ShowError(IDS_DINPUT_ERROR_DF);
- return E_FAIL;
- }
-
- // Set cooperative level
- if( FAILED( g_pdidKeyboard->SetCooperativeLevel( hWnd,
- DISCL_NONEXCLUSIVE | DISCL_FOREGROUND ) ) )
- {
- ShowError(IDS_DINPUT_ERROR_SP);
- return E_FAIL;
- }
-
- // try to acquire the keyboard
- if( SUCCEEDED( g_pdidKeyboard->Acquire() ) )
- g_bKeyboardAcquired = TRUE;
- else
- g_bKeyboardAcquired = FALSE;
-
- return S_OK;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: DIUtil_ReadKeys()
- // Desc: Use DirectInput to read game-play keys
- //-----------------------------------------------------------------------------
- VOID DIUtil_ReadKeys( DWORD* pdwKeys )
- {
- BYTE rgbKeybd[256];
- DWORD dwKeys = 0L;
- HRESULT hr;
-
- hr = g_pdidKeyboard->GetDeviceState( sizeof(rgbKeybd), rgbKeybd );
- if( FAILED(hr) )
- {
- if( hr == DIERR_INPUTLOST )
- {
- // We lost control of the keyboard, reacquire
- if( SUCCEEDED( g_pdidKeyboard->Acquire() ) )
- g_bKeyboardAcquired = TRUE;
- else
- g_bKeyboardAcquired = FALSE;
- }
-
- // Failed to read the keyboard, just return
- return;
- }
-
- // check & update key states
- if( rgbKeybd[DIK_NUMPAD5] & 0x80 )
- dwKeys |= KEY_STOP;
-
- if( (rgbKeybd[DIK_NUMPAD2] & 0x80) || (rgbKeybd[DIK_DOWN] & 0x80) )
- dwKeys |= KEY_DOWN;
-
- if( (rgbKeybd[DIK_NUMPAD4] & 0x80) || (rgbKeybd[DIK_LEFT] & 0x80) )
- dwKeys |= KEY_LEFT;
-
- if( (rgbKeybd[DIK_NUMPAD6] & 0x80) || (rgbKeybd[DIK_RIGHT] & 0x80) )
- dwKeys |= KEY_RIGHT;
-
- if( (rgbKeybd[DIK_NUMPAD8] & 0x80) || (rgbKeybd[DIK_UP] & 0x80) )
- dwKeys |= KEY_UP;
-
- if( rgbKeybd[DIK_SPACE] & 0x80 )
- dwKeys |= KEY_FIRE;
-
- // Return the keys
- (*pdwKeys) = dwKeys;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: DIUtil_CleanupInput()
- // Desc: Cleans up DirectInput objects
- //-----------------------------------------------------------------------------
- VOID DIUtil_CleanupInput()
- {
- if(g_bKeyboardAcquired)
- {
- g_pdidKeyboard->Unacquire();
- g_bKeyboardAcquired = FALSE;
- }
-
- if( g_pdidKeyboard )
- g_pdidKeyboard->Release();
-
- if( g_pDI )
- g_pDI->Release();
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: DIUtil_ReacquireInputDevices()
- // Desc: Reacquires DirectInput devices as needed
- //-----------------------------------------------------------------------------
- HRESULT DIUtil_ReacquireInputDevices()
- {
- g_bKeyboardAcquired = FALSE;
-
- if( NULL == g_pdidKeyboard )
- return E_FAIL;
-
- g_pdidKeyboard->Acquire();
- g_bKeyboardAcquired = TRUE;
-
- return S_OK;
- }
-
-
-
-